У меня есть таблица, некоторые ее столбцы неизвестны во время компиляции. Такие столбцы могут иметь либо целочисленное значение, либо некоторое значение Enum. Существует таблица, которая содержит все имена таких динамических столбцов, а также тип столбца. Этот «метатабельный» имеет следующие столбцы:
- DynamicColumnId (Pk)
- Имя
- TypeId (Integer / Enum, как Fk из отдельной таблицы)
Целочисленные столбцы имеют Имя из этой таблицы, тогда как столбцы Enum являются столбцами Fk из таблицы, которая имеет Имя , с некоторой модификацией (например, префикс «DynamicTable»).
Единственное решение, которое я мог бы придумать для этой ситуации, - это использование Reflection.Emit для динамического создания класса Entity и соответствующего класса Mapping. По общему признанию, я новичок в NHybernate / Fluent NHybernate, и это похоже на относительно простую иерархию между таблицами, и поэтому я хотел убедиться, что мое решение не так страшно, как кажется на первый взгляд ...
Я также приветствовал бы решения, которые полностью игнорируют мою иерархию таблиц, чтобы эффективно получать те же результаты (то есть перечислять строки в динамической таблице, проходя по всем столбцам, зная, являются ли они Enums и , если они есть, их возможные значения).
( Редактировать: дополнительная информация о проблемной области )
Я изначально включил минимальные детали, чтобы избежать путаницы в Too-Much-Info.
Это описание намного сложнее, но оно раскрывает мотивы этого дизайна.
Приложение предназначено для автоматизации анализа журналов / дампов. Аналитические сценарии часто предоставляются экспертами по журналу / дампу, и поэтому, чтобы упростить типичный процесс цикла проверки требований => реализация =>, такие аналитические сценарии реализуются экспертами непосредственно в виде фрагмента кода Iron Python с некоторые предметно-ориентированные конструкции, внедренные в область действия фрагментов. Каждый фрагмент имеет «контекст», для которого он актуален. Примером «контекста» могут быть «продукт», «версия» и т. Д. Итак, сам фрагмент вызывается только в определенных контекстах - это помогает упростить код Python за счет исключения ветвления (вы можете рассматривать его как аспектно-ориентированное программирование в некоторой степени). Неэксперт может использовать приложение с заданной базой данных контекстного кода для анализа журнала / дампа после выбора значений для различных контекстов.
Когда эксперт решает, что для каталогизации определенного фрагмента кода требуется новый контекст, он может добавить контекст, указывая возможные значения, которые он может иметь. После добавления нового контекста в базу данных неэксперт, который проводит анализ, получит возможность выбрать значение для вновь добавленного контекста.
«Динамическая таблица» - это таблица, которая связывает фрагмент кода со значениями различных контекстов (столбцов), которые существовали на момент его создания, плюс значения по умолчанию для столбцов, которые не существовали в то время.